/*

316. 去除重复字母
给你一个字符串 s ，请你去除字符串中重复的字母，使得每个字母只出现一次。需保证 返回结果的字典序最小（要求不能打乱其他字符的相对位置）。

注意：该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同

 

示例 1：

输入：s = "bcabc"
输出："abc"
示例 2：

输入：s = "cbacdcbc"
输出："acdb"
 

提示：

1 <= s.length <= 104
s 由小写英文字母组成
*/

class Solution {
public:
    string removeDuplicateLetters(string s) {
          string stk;//模拟栈
        string res;
        unordered_map<char, int> Dict; //辅助记忆表
        for(auto &ch: s){
            Dict[ch]++;
        }
        for(int i = 0; i < s.size(); ++i){

            //去除重复元素 //因为这里只存在一次的字母会破坏单调性
            if(stk.find(s[i]) != string::npos){
                Dict[s[i]]--;
                continue;
                }
            while(stk.size()!=0 && stk.back() >= s[i] && Dict[stk.back()] > 1){
                Dict[stk.back()]--;
                stk.pop_back();
            }
            stk.push_back(s[i]);
        }
        return stk;
 
    }
};